/**
 * 
 */
package com.alstudio.module;

import com.alstudio.event.ALEventDeliver;

import android.content.Context;

/**
 * 功能模块的基类。所有注册到ALModuleManager管理器中的模块必须继承本类并实现所有接口
 * 请注意一定要给handleEvent赋值，保证模块的唯一性。模块管理器根据此handleEvent类型做事件分发
 * 
 * @author alonso lee
 * 
 */
public abstract class BaseModule {

	protected Context context;

	// 模块可处理的事件类型
	protected Class<?> handleEvent;

	/**
	 * 初始化并注册到模块管理器的方法。必须自行实现模块的所有初始化工作。
	 * 
	 * @param context
	 */
	public abstract void registerModule(Context context);

	/**
	 * 停止模块并将模块从模块管理器中移除的方法。必须自行实现模块的自销毁工作
	 * 
	 * @param context
	 */
	public abstract void unregisterModule(Context context);

	/**
	 * 处理模块管理器下发到模块的事件
	 * 
	 * @param event
	 *            模块管理器下发到模块的事件
	 */
	public abstract void onModuleManagerEvent(Object event);

	/**
	 * 创建模块事件对象
	 */
	public abstract ModuleEvent newModuleEvent();

	/**
	 * 描述模块可处理的事件类型。必须在加入模块管理器之前设定。模块管理器根据事件类型查找模块
	 * 
	 * @param event
	 */
	public abstract void setHandleEvent(Class<?> event);

	/**
	 * 模块投递事件到模块管理器
	 * 
	 * @param event
	 */
	public void postModuleEvent(ModuleEvent event) {
		ALEventDeliver.getDefaultAlEventDeliver().postALEvent(event);
	}
	
	public Class<?> getHandleEvent(){
		return handleEvent;
	}
}
